home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 85 / CD Temático 40 Febrero 2004.iso / DOS / testdisk / src / md.h < prev    next >
Encoding:
C/C++ Source or Header  |  2004-01-02  |  6.6 KB  |  190 lines

  1. /*
  2.  
  3.     File: md.h
  4.  
  5.     Copyright (C) 1998-2004 Christophe GRENIER <grenier@cgsecurity.org>
  6.   
  7.     This software is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 2 of the License, or
  10.     (at your option) any later version.
  11.   
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.   
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  */
  22. /*
  23.    physical layout of Linux RAID devices
  24.           Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
  25. */
  26.  
  27. #ifndef _MD_P_H
  28. #define _MD_P_H
  29.  
  30. /*
  31.  * RAID superblock.
  32.  *
  33.  * The RAID superblock maintains some statistics on each RAID configuration.
  34.  * Each real device in the RAID set contains it near the end of the device.
  35.  * Some of the ideas are copied from the ext2fs implementation.
  36.  *
  37.  * We currently use 4096 bytes as follows:
  38.  *
  39.  *    word offset    function
  40.  *
  41.  *       0  -    31    Constant generic RAID device information.
  42.  *        32  -    63   Generic state information.
  43.  *      64  -   127    Personality specific information.
  44.  *     128  -   511    12 32-words descriptors of the disks in the raid set.
  45.  *     512  -   911    Reserved.
  46.  *     912  -  1023    Disk specific descriptor.
  47.  */
  48.  
  49. /*
  50.  * If x is the real device size in bytes, we return an apparent size of:
  51.  *
  52.  *    y = (x & ~(MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
  53.  *
  54.  * and place the 4kB superblock at offset y.
  55.  */
  56. #define MD_RESERVED_BYTES        (64 * 1024)
  57. #define MD_RESERVED_SECTORS        (MD_RESERVED_BYTES / 512)
  58. #define MD_RESERVED_BLOCKS        (MD_RESERVED_BYTES / BLOCK_SIZE)
  59.  
  60. #define MD_NEW_SIZE_SECTORS(x)        ((x & ~(MD_RESERVED_SECTORS - 1)) - MD_RESERVED_SECTORS)
  61. #define MD_NEW_SIZE_BLOCKS(x)        ((x & ~(MD_RESERVED_BLOCKS - 1)) - MD_RESERVED_BLOCKS)
  62.  
  63. #define MD_SB_BYTES            4096
  64. #define MD_SB_WORDS            (MD_SB_BYTES / 4)
  65. #define MD_SB_BLOCKS            (MD_SB_BYTES / BLOCK_SIZE)
  66. #define MD_SB_SECTORS            (MD_SB_BYTES / 512)
  67.  
  68. /*
  69.  * The following are counted in 32-bit words
  70.  */
  71. #define    MD_SB_GENERIC_OFFSET        0
  72. #define MD_SB_PERSONALITY_OFFSET    64
  73. #define MD_SB_DISKS_OFFSET        128
  74. #define MD_SB_DESCRIPTOR_OFFSET        992
  75.  
  76. #define MD_SB_GENERIC_CONSTANT_WORDS    32
  77. #define MD_SB_GENERIC_STATE_WORDS    32
  78. #define MD_SB_GENERIC_WORDS        (MD_SB_GENERIC_CONSTANT_WORDS + MD_SB_GENERIC_STATE_WORDS)
  79. #define MD_SB_PERSONALITY_WORDS        64
  80. #define MD_SB_DESCRIPTOR_WORDS        32
  81. #define MD_SB_DISKS            27
  82. #define MD_SB_DISKS_WORDS        (MD_SB_DISKS*MD_SB_DESCRIPTOR_WORDS)
  83. #define MD_SB_RESERVED_WORDS        (1024 - MD_SB_GENERIC_WORDS - MD_SB_PERSONALITY_WORDS - MD_SB_DISKS_WORDS - MD_SB_DESCRIPTOR_WORDS)
  84. #define MD_SB_EQUAL_WORDS        (MD_SB_GENERIC_WORDS + MD_SB_PERSONALITY_WORDS + MD_SB_DISKS_WORDS)
  85.  
  86. /*
  87.  * Device "operational" state bits
  88.  */
  89. #define MD_DISK_FAULTY        0 /* disk is faulty / operational */
  90. #define MD_DISK_ACTIVE        1 /* disk is running or spare disk */
  91. #define MD_DISK_SYNC        2 /* disk is in sync with the raid set */
  92. #define MD_DISK_REMOVED        3 /* disk is in sync with the raid set */
  93.  
  94. typedef struct mdp_device_descriptor_s {
  95.     __u32 number;        /* 0 Device number in the entire set          */
  96.     __u32 major;        /* 1 Device major number              */
  97.     __u32 minor;        /* 2 Device minor number              */
  98.     __u32 raid_disk;    /* 3 The role of the device in the raid set   */
  99.     __u32 state;        /* 4 Operational state                  */
  100.     __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
  101. } mdp_disk_t;
  102.  
  103. #define MD_SB_MAGIC        0xa92b4efc
  104.  
  105. /*
  106.  * Superblock state bits
  107.  */
  108. #define MD_SB_CLEAN        0
  109. #define MD_SB_ERRORS        1
  110.  
  111. typedef struct mdp_superblock_s {
  112.     /*
  113.      * Constant generic information
  114.      */
  115.     __u32 md_magic;        /*  0 MD identifier                   */
  116.     __u32 major_version;    /*  1 major version to which the set conforms */
  117.     __u32 minor_version;    /*  2 minor version ...                  */
  118.     __u32 patch_version;    /*  3 patchlevel version ...              */
  119.     __u32 gvalid_words;    /*  4 Number of used words in this section    */
  120.     __u32 set_uuid0;    /*  5 Raid set identifier              */
  121.     __u32 ctime;        /*  6 Creation time                  */
  122.     __u32 level;        /*  7 Raid personality                  */
  123.     __u32 size;        /*  8 Apparent size of each individual disk   */
  124.     __u32 nr_disks;        /*  9 total disks in the raid set          */
  125.     __u32 raid_disks;    /* 10 disks in a fully functional raid set    */
  126.     __u32 md_minor;        /* 11 preferred MD minor device number          */
  127.     __u32 not_persistent;    /* 12 does it have a persistent superblock    */
  128.     __u32 set_uuid1;    /* 13 Raid set identifier #2              */
  129.     __u32 set_uuid2;    /* 14 Raid set identifier #3              */
  130.     __u32 set_uuid3;    /* 15 Raid set identifier #4              */
  131.     __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16];
  132.  
  133.     /*
  134.      * Generic state information
  135.      */
  136.     __u32 utime;        /*  0 Superblock update time              */
  137.     __u32 state;        /*  1 State bits (clean, ...)              */
  138.     __u32 active_disks;    /*  2 Number of currently active disks          */
  139.     __u32 working_disks;    /*  3 Number of working disks              */
  140.     __u32 failed_disks;    /*  4 Number of failed disks              */
  141.     __u32 spare_disks;    /*  5 Number of spare disks              */
  142.     __u32 sb_csum;        /*  6 checksum of the whole superblock        */
  143. #ifdef __BIG_ENDIAN
  144.     __u32 events_hi;    /*  7 high-order of superblock update count   */
  145.     __u32 events_lo;    /*  8 low-order of superblock update count    */
  146. #else
  147.     __u32 events_lo;    /*  7 low-order of superblock update count    */
  148.     __u32 events_hi;    /*  8 high-order of superblock update count   */
  149. #endif
  150.     __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 9];
  151.  
  152.     /*
  153.      * Personality information
  154.      */
  155.     __u32 layout;        /*  0 the array's physical layout          */
  156.     __u32 chunk_size;    /*  1 chunk size in bytes              */
  157.     __u32 root_pv;        /*  2 LV root PV */
  158.     __u32 root_block;    /*  3 LV root block */
  159.     __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4];
  160.  
  161.     /*
  162.      * Disks information
  163.      */
  164.     mdp_disk_t disks[MD_SB_DISKS];
  165.  
  166.     /*
  167.      * Reserved
  168.      */
  169.     __u32 reserved[MD_SB_RESERVED_WORDS];
  170.  
  171.     /*
  172.      * Active descriptor
  173.      */
  174.     mdp_disk_t this_disk;
  175.  
  176. } mdp_super_t;
  177.  
  178. static inline __u64 md_event(mdp_super_t *sb) {
  179.     __u64 ev = sb->events_hi;
  180.     return (ev<<32)| sb->events_lo;
  181. }
  182.  
  183. /* TestDisk */
  184. int check_MD(t_param_disk *disk_car,t_diskext *partition,const int debug);
  185. int test_MD(t_param_disk *disk_car, const struct mdp_superblock_s *sb,t_diskext *partition,const int debug, const int dump_ind);
  186. int recover_MD(t_param_disk *disk_car, const struct mdp_superblock_s *sb,t_diskext *partition,const int debug, const int dump_ind);
  187. int set_MD_info(t_param_disk *disk_car, const struct mdp_superblock_s *sb,t_diskext *partition,const int debug, const int dump_ind);
  188. #endif 
  189.  
  190.